package com.ipartek.formacion.migracion9.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;

import org.apache.log4j.Logger;

import com.ipartek.formacion.migracion9.beans.Persona;
import com.ipartek.formacion.migracion9.ddbb.MySqlDAOFactory;
import com.ipartek.formacion.migracion9.interfaces.InterfacePersonaDAO;

/**
 * Clase que implementa la interface InterfacePersonaDAO para la base de datos
 * MySql
 * 
 * @author Equipo a9, fila 3
 * 
 */
public class MySqlPersonaDAO implements InterfacePersonaDAO {

	private Connection conexion = null;
	private static PreparedStatement pst = null;
	private static final Logger log = Logger.getLogger(MySqlDAOFactory.class);
	private String sql = "insert into migracion.personas (migracion.personas.nombre, migracion.personas.apellido1, migracion.personas.apellido2, migracion.personas.edad, migracion.personas.email,migracion.personas.dni,migracion.personas.rol) values (?, ?, ?, ?, ?, ?, ?)";
	private String sqlBorrar = "truncate table migracion.personas";

	@Override
	public void conectar() {
		conexion = MySqlDAOFactory.conectar();
		try {
			conexion.setAutoCommit(false);
		} catch (SQLException e) {
			log.error("Error al intencar cambiar a false el setAutoCommit");
		}
	}

	@Override
	public void anadirPersona(Persona persona) throws SQLException {
		pst = conexion.prepareStatement(sql);
		pst.setString(1, persona.getNombre());
		pst.setString(2, persona.getApellido1());
		pst.setString(3, persona.getApellido2());
		pst.setInt(4, persona.getEdad());
		pst.setString(5, persona.getEmail());
		pst.setString(6, persona.getDni());
		pst.setString(7, persona.getRol());
		pst.executeUpdate();
		log.info("Valido: " + persona.toString());
	}

	@Override
	public void comitar() {
		try {
			conexion.commit();
			log.trace("Se realiza el commit.");
		} catch (SQLException e) {
			if (conexion != null) {
				// En caso de Fallo
				try {
					conexion.rollback();
					log.info("Se va a realizar el rollback");
				} catch (SQLException e1) {
					log.error("Error a la hora de realizar el rollback");
				}
			}
			e.printStackTrace();
		} catch (Exception e) {
			if (conexion != null) {
				// En caso de Fallo
				try {
					conexion.rollback();
					log.info("Se va a realizar el rollback");
				} catch (SQLException e1) {
					log.error("Error a la hora de realizar el rollback");
				}
			}
			e.printStackTrace();
		} finally {
			try {
				if (conexion != null && !conexion.isClosed()) {
					MySqlDAOFactory.desconectar(conexion);
				}
			} catch (SQLException e) {
				log.error("Error a la hora de realizar la desconexion de la base de datos.");
			}
		}
	}

	@Override
	public void borrar() {
		try {
			conexion.setAutoCommit(true);
			pst = conexion.prepareStatement(sqlBorrar);
			pst.executeUpdate();
			conexion.setAutoCommit(false);
		} catch (SQLException e) {
			log.error("Se ha producido un error al intentar borrar la tabla");
		}

	}
}
